<?php

/**
 *
 * 存储健区分大小写
 * 获取和设置配置参数 支持批量定义,支持无限层
 *
 * 加载文件:config(include($file));支持多次加载
 * 加载文件:config(include($file), '键(文件名)');设置以文件名为键
 * 设置临时参数:config('a.b.c', 'abc');
 *
 * 获取所有的参数:config();
 * 获取单个值:config('a.b.c');
 *
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @param mixed $default 默认值
 * @see https://gitee.com/sgfoot/php-config
 * @author freelife2020@163.com
 * @return mixed
 */
function config($name = null, $value = null, $default = null)
{
    static $_config = array();
    if (!function_exists('array_get')) {
        /**
         * 获取key值,递归
         * @param $str string 以.隔开
         * @param $array array 多维数组
         * @return mixed|null
         */
        function array_get($str, $array)
        {
            $list   = explode('.', $str);
            $first  = array_shift($list);
            $result = isset($array[$first]) ? $array[$first] : null;
            if ($result && is_array($result) && count($list) > 0) {
                return array_get(join('.', $list), $result);
            }
            return $result;
        }
    }
    if (!function_exists('array_set')) {
        /**
         * 数组设置动态值
         * @param $str string 以.隔开的字符串
         * @param $val mixed 值
         * @param $array array 引用,目标数据
         * @return array
         */
        function array_set($str, $val, &$array)
        {
            $list  = explode('.', $str);
            $first = array_shift($list);
            if (count($list) > 0) {
                return array_set(join('.', $list), $val, $array[$first]);
            }
            $array[$first] = $val;
        }
    }
    // 无参数时获取所有
    if (is_null($name)) return $_config;
    // 优先执行设置获取或赋值
    if (is_string($name)) {
        $name = explode('.', $name);
        //获取值
        if (is_null($value)) {
            $rs = array_get(join('.', $name), $_config);
            return is_null($rs) ? $default : $rs;
        }
        //设置值
        array_set(join('.', $name), $value, $_config);
        return null;
    }
    //批量设置
    if (is_array($name)) {
        if (is_null($value)) {
            $_config = array_merge($_config, $name);
        } else {
            $_config = array_merge($_config, array($value => $name));
        }
        return null;
    }
    return null; // 避免非法参数
}
/**
 * 存储健不区分大小写
 * 获取和设置配置参数 支持批量定义,支持无限层
 *
 * 加载文件:configCase(include($file));支持多次加载
 * 加载文件:configCase(include($file), '键(文件名)');设置以文件名为键
 * 设置临时参数:configCase('a.b.c', 'abc');
 *
 * 获取所有的参数:configCase();
 * 获取单个值:configCase('a.b.c');
 *
 * @param string|array $name 配置变量
 * @param mixed $value 配置值
 * @param mixed $default 默认值
 * @see https://gitee.com/sgfoot/php-config
 * @author freelife2020@163.com
 * @return mixed
 */
function configCase($name = null, $value = null, $default = null)
{
    static $_config = array();
    if (!function_exists('array_case')) {
        /**
         * 将array的key转换成大写,递归
         * @param $array
         * @param int $case
         */
        function array_case(&$array, $case = CASE_UPPER)
        {
            $array = array_change_key_case($array, $case);
            foreach ($array as $key => $val) {
                if (is_array($val)) {
                    array_case($array[$key], $case);
                }
            }
        }
    }
    if (!function_exists('array_get')) {
        /**
         * 获取key值,递归
         * @param $str string 以.隔开
         * @param $array array 多维数组
         * @return mixed|null
         */
        function array_get($str, $array)
        {
            $list   = explode('.', $str);
            $first  = array_shift($list);
            $result = isset($array[$first]) ? $array[$first] : null;
            if ($result && is_array($result) && count($list) > 0) {
                return array_get(join('.', $list), $result);
            }
            return $result;
        }
    }
    if (!function_exists('array_set')) {
        /**
         * 数组设置动态值
         * @param $str string 以.隔开的字符串
         * @param $val mixed 值
         * @param $array array 引用,目标数据
         * @return array
         */
        function array_set($str, $val, &$array)
        {
            $list  = explode('.', $str);
            $first = array_shift($list);
            if (count($list) > 0) {
                return array_set(join('.', $list), $val, $array[$first]);
            }
            $array[$first] = $val;
        }
    }
    // 无参数时获取所有
    if (is_null($name)) return $_config;
    // 优先执行设置获取或赋值
    if (is_string($name)) {
        $name = explode('.', $name);
        array_walk($name, function (&$val) {
            $val = strtoupper($val);
        });
        //获取值
        if (is_null($value)) {
            $rs = array_get(join('.', $name), $_config);
            return is_null($rs) ? $default : $rs;
        }
        //设置值
        array_set(join('.', $name), $value, $_config);
        return null;
    }
    //批量设置
    if (is_array($name)) {
        array_case($name);
        if (is_null($value)) {
            $_config = array_merge($_config, $name);
        } else {
            $_config = array_merge($_config, array(strtoupper($value) => $name));
        }
        return null;
    }
    return null; // 避免非法参数
}

